package ee.ttu.frontend.service;

import ee.ttu.model.*;
import ee.ttu.repository.*;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * Created by Kristina Nogteva on 25.03.2015.
 */


@Service
public class UserServiceImpl implements UserService{

		@Autowired
		AuthenticationService authenticationService;
	
		@Autowired
		KasutajaRepository kasutajaRepository;
		
		@Autowired
		KlassifikaatorRepository klassifikaatorRepository;

        @Autowired
        TudengRepository tudengRepository;

        @Autowired
        OppejoudRepository oppejoudRepository;

        @Autowired
        KlassifikaatorLinkRepository klassifikaatorLinkRepository;
        

        final static Logger logger = Logger.getLogger(UserServiceImpl.class);
        
		
		@Override
		public Kasutaja getUser(int usersId){
			
			Kasutaja kasutaja = kasutajaRepository.findOne((long) usersId);
			logger.info("Kaivitan getUser IDga: " + usersId);
			
			return kasutaja;
		}

        /**
         * Konkreetse kasutaja andmete vaatamine
         * @param userId
         * @return
         */

        @Override
        public Tudeng getTudeng(long tudengId){
            Tudeng tudeng = tudengRepository.findOne(tudengId);
            
            logger.info("Kaivitan getTudeng IDga: " + tudengId);
            logger.info("getTudeng vastus: "+ tudengRepository.findOne(tudengId));
            
            return tudeng;
        }

        @Override
        public Oppejoud getOppejoud(long oppejoudId){
           Oppejoud oppejoud = oppejoudRepository.findOne(oppejoudId);
           
           logger.info("Kaivitan getOppejoud IDga: " + oppejoudId);
           logger.info("getOppejoud vastus: "+ oppejoudRepository.findOne(oppejoudId));
           
            return oppejoud;
        }

        /**
         * Kõikide tudengite andmete kuvamine
         * @return
         */
        public List<Tudeng> getTudengid(){
        	
            List<Tudeng> tudengid =(List<Tudeng>) tudengRepository.findAll();
            
            logger.error("Tudengid vastus: "+ tudengRepository.findAll());
            return tudengid;
        }

        /**
         * Kõikide õppejõudude andmete kuvamine
         * @return
         */
        public List<Oppejoud> getKoikoppejoud(){

            List<Oppejoud> oppejoud = (List<Oppejoud>) oppejoudRepository.findAll();
            logger.error("getKoikoppejoud vastus: "+ oppejoudRepository.findAll());
            
            return oppejoud;
        }

		@Override
		public Kasutaja getUser(long userId) {
			Kasutaja kasutaja = kasutajaRepository.findOne(userId);
			return kasutaja;
		}
		
/*

	@Override
	public void saveNewUser(Kasutaja kasutaja, Model model){
		
		ArrayList<String> errors = new ArrayList<String>();

		if (kasutajaRepository.findByKontoNimi(kasutaja.getKontoNimi()) == null) {

			
			kasutaja.setKontoStaatus(klassifikaatorRepository.findOne((long) 1));
			errors = kasutajaValidator.validate(kasutaja);
			if (errors.size() > 0) {
				model.addAttribute("errors", errors);
			} else {

				KontoSyndmus kontoSyndmus = new KontoSyndmus();
				kontoSyndmus.setKasutaja(kasutaja);
				kontoSyndmus.setVanaStaatus(klassifikaatorRepository
						.findOne(kasutaja.getKontoStaatus().getId()));
				kontoSyndmus.setUusStaatus(klassifikaatorRepository
						.findOne(kasutaja.getKontoStaatus().getId()));
				kontoSyndmus.setKontoSyndmuseLiik(klassifikaatorRepository
						.findOne((long) 8));
				Date date = new Date();
				kontoSyndmus.setLoodud(date);
				kasutajaRepository.save(kasutaja);

			}

		}
	}
	
	@Override
	public void updateUser(Kasutaja uusKasutaja,String username,String password,Model model) throws NoPermissionException{
		
		
		ArrayList<String> errors = new ArrayList<String>();

		Kasutaja vanaKasutaja = kasutajaRepository.findOne(uusKasutaja.getId());
		Kasutaja operatsiooniTegija = kasutajaRepository.findByKontoNimi(username);
		if ((authenticationService
				.providedPasswordIsCorrect(username, password))
				&& ((uusKasutaja.getKontoNimi()== username || operatsiooniTegija
						.getKasutajaTyyp().getId()==7))) {

			errors = kasutajaValidator.validate(uusKasutaja);
			errors = updateUserValidator.validate(uusKasutaja, vanaKasutaja,
					errors);
			if (errors.size() > 0) {
				model.addAttribute("errors", errors);
			} else {

				KontoSyndmus kontoSyndmus = new KontoSyndmus();
				kontoSyndmus.setKasutaja(uusKasutaja);
				kontoSyndmus.setVanaStaatus(klassifikaatorRepository
						.findOne(vanaKasutaja.getKontoStaatus().getId()));
				kontoSyndmus.setUusStaatus(klassifikaatorRepository
						.findOne(uusKasutaja.getKontoStaatus().getId()));
				kontoSyndmus.setKontoSyndmuseLiik(klassifikaatorRepository
						.findOne((long) 8));
				Date date = new Date();
				kontoSyndmus.setLoodud(date);
				kasutajaRepository.save(uusKasutaja);
			}
		} else {
			throw new NoPermissionException();
		}
	}

	@Override
	public ArrayList<Kasutaja> getUsers(String username, String password)
			throws NoPermissionException {
		
		Kasutaja operatsiooniTegija = kasutajaRepository.findByKontoNimi(username);
		if ((authenticationService
				.providedPasswordIsCorrect(username, password))
				&& (operatsiooniTegija.getKasutajaTyyp().getId()==7)){
			 ArrayList<Kasutaja> kasutajad = (ArrayList<Kasutaja>) kasutajaRepository.findAll();
			return kasutajad;
		}
		else{
			throw new NoPermissionException();
		}
	}

	

	@Override
	public void activateUser(String usersUsername, String username,
			String password,Model model) throws NoPermissionException {
		
		Kasutaja operatsiooniTegija = kasutajaRepository.findByKontoNimi(username);
		Kasutaja kasutaja = kasutajaRepository.findByKontoNimi(usersUsername);
		ArrayList<String> errors = new ArrayList<String>();
		
		if ((authenticationService
				.providedPasswordIsCorrect(username, password)&&(operatsiooniTegija.getKasutajaTyyp().getId()==7))){
			errors = activateUserValidator.validate(kasutaja);
			if (errors.size() > 0) {
				model.addAttribute("errors", errors);
			} else {
				Klassifikaator vanaStaatus = kasutaja.getKontoStaatus();
				kasutaja.setKontoStaatus(klassifikaatorRepository.findOne((long) 2));
				
				KontoSyndmus kontoSyndmus = new KontoSyndmus();
				kontoSyndmus.setKasutaja(kasutaja);
				kontoSyndmus.setVanaStaatus(vanaStaatus);
				kontoSyndmus.setUusStaatus(klassifikaatorRepository.findOne((long) 2));
				kontoSyndmus.setKontoSyndmuseLiik(klassifikaatorRepository
						.findOne((long) 9));
				Date date = new Date();
				kontoSyndmus.setLoodud(date);
				
				kasutajaRepository.save(kasutaja);
				
			}
		}
		else {
		throw new NoPermissionException();
		}
		
	}

	@Override
	public void deactivateUser(String usersUsername, String username,
			String password,Model model) throws NoPermissionException {
		
		Kasutaja operatsiooniTegija = kasutajaRepository.findByKontoNimi(username);
		Kasutaja kasutaja = kasutajaRepository.findByKontoNimi(usersUsername);
		ArrayList<String> errors = new ArrayList<String>();
		
		if ((authenticationService
				.providedPasswordIsCorrect(username, password)&&(operatsiooniTegija.getKasutajaTyyp().getId()==4))){
			errors = deactivateUserValidator.validate(kasutaja);
			if (errors.size() > 0) {
				model.addAttribute("errors", errors);
			} else {
				
				
				Klassifikaator vanaStaatus = kasutaja.getKontoStaatus();
				kasutaja.setKontoStaatus(klassifikaatorRepository.findOne((long) 3));
				
				KontoSyndmus kontoSyndmus = new KontoSyndmus();
				kontoSyndmus.setKasutaja(kasutaja);
				kontoSyndmus.setVanaStaatus(vanaStaatus);
				kontoSyndmus.setUusStaatus(klassifikaatorRepository.findOne((long) 3));
				kontoSyndmus.setKontoSyndmuseLiik(klassifikaatorRepository
						.findOne((long) 10));
				Date date = new Date();
				kontoSyndmus.setLoodud(date);
				kasutajaRepository.save(kasutaja);
				
			}
		
		}
		else {
		throw new NoPermissionException();
		}
		
		
	}
	
	*/
}
